import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 合并两个有序链表
     * @param pHead1 第一个有序链表的头节点
     * @param pHead2 第二个有序链表的头节点
     * @return 合并后有序链表的头节点
     */
    public ListNode Merge (ListNode pHead1, ListNode pHead2) {
        // 处理空链表情况
        if (pHead1 == null) return pHead2;
        if (pHead2 == null) return pHead1;
        
        // 创建哑节点,简化头节点处理
        ListNode dummy = new ListNode(0);
        ListNode current = dummy;
        
        // 双指针遍历两个链表,按值大小合并
        while (pHead1 != null && pHead2 != null) {
            if (pHead1.val <= pHead2.val) {
                current.next = pHead1;  // 链接较小的节点
                pHead1 = pHead1.next;   // 移动对应链表的指针
            } else {
                current.next = pHead2;
                pHead2 = pHead2.next;
            }
            current = current.next;  // 移动当前合并链表的指针
        }
        
        // 链接剩余未遍历的节点(其中一个链表已遍历完)
        current.next = (pHead1 != null) ? pHead1 : pHead2;
        
        return dummy.next;  // 哑节点的下一个是合并后的头节点
    }
}