package com.example.demo.leecode;
/**
 * 合并两个有序链表
 * @Date 2020/12/11
 * @author Tang
 *
 * 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
 *
 * /**
 *  * Definition for singly-linked list.
 *  * public class ListNode {
 *  *     int val;
 *  *     ListNode next;
 *  *     ListNode() {}
 *  *     ListNode(int val) { this.val = val; }
 *  *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 *  * }
 *
 */
public class MergeTwoSortedLists {
    public ListNode execute(ListNode l1, ListNode l2){
        if(l1 == null){
            return l2;
        }
        if(l2 == null){
            return l1;
        }
        ListNode firstNode;
        ListNode endNode;
        
        //先确定头节点
        if(l1.val <= l2.val){
            firstNode = l1;
            endNode = firstNode;
            l1 = l1.next;
        }else{
            firstNode = l2;
            endNode = firstNode;
            l2 = l2.next;
        }
        while(true){
            if(l1 == null || l2 == null){
                break;
            }
            if(l1.val <= l2.val){
                endNode.next = l1;
                endNode = l1;
                l1 = l1.next;
            }else{
                endNode.next = l2;
                endNode = l2;
                l2 = l2.next;
            }
        }
        while(l1 != null){
            endNode.next = l1;
            endNode = l1;
            l1 = l1.next;
        }
        while(l2 != null){
            endNode.next = l2;
            endNode = l2;
            l2 = l2.next;
        }
        return firstNode;
    }
    public static void main(String[] args) {
        ListNode left1 = new ListNode(1);
        ListNode left2 = new ListNode(2);
        ListNode left3 = new ListNode(5);
        ListNode left4 = new ListNode(6);
        ListNode left5 = new ListNode(6);
        ListNode left6 = new ListNode(8);
        left1.next = left2;
        left2.next = left3;
        left3.next = left4;
        left4.next = left5;
        left5.next = left6;
        ListNode right1 = new ListNode(1);
        ListNode right2 = new ListNode(2);
        ListNode right3 = new ListNode(2);
        ListNode right4 = new ListNode(7);
        right1.next = right2;
        right2.next = right3;
        right3.next = right4;
        ListNode result = new MergeTwoSortedLists().execute(left1, right1);
        System.out.println(result.val);
        while(result.hasNext()){
            result = result.next;
            System.out.println(result.val);
        }
    }
}
class ListNode {
      int val;
      ListNode next;
      ListNode() {}
      ListNode(int val) {
          this.val = val;
      }
      ListNode(int val, ListNode next) {
          this.val = val;
          this.next = next;
      }
      boolean hasNext(){
          return next != null;
      }
}