package linkedlist;
/**
* 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
* <p>
* 示例 1:
* <p>
* 输入:l1 = [1,2,4], l2 = [1,3,4]
* 输出:[1,1,2,3,4,4]
* 示例 2:
* <p>
* 输入:l1 = [], l2 = []
* 输出:[]
* 示例 3:
* <p>
* 输入:l1 = [], l2 = [0]
* 输出:[0]
*
* <p>
* 提示:
* <p>
* 两个链表的节点数目范围是 [0, 50]
* -100 <= Node.val <= 100
* l1 和 l2 均按 非递减顺序 排列
* <p>
* 作者:力扣 (LeetCode)
* 链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnnbp2/
* 来源:力扣(LeetCode)
* 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*/
public class MergeTwoLists {
private static 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 static void main(String[] args) {
ListNode list1Node3 = new ListNode(6);
ListNode list1Node2 = new ListNode(2, list1Node3);
ListNode list1Node1 = new ListNode(1, list1Node2);
ListNode list2Node3 = new ListNode(5);
ListNode list2Node2 = new ListNode(4, list2Node3);
ListNode list2Node1 = new ListNode(1, list2Node2);
ListNode listNode = mergeTwoLists(list1Node1, list2Node1);
while (listNode.next!=null){
System.out.println("val "+listNode.val);
listNode = listNode.next;
}
System.out.println("val "+listNode.val);
}
// 1 2 6
// 1 4 5
//
// head->[1, 1, 2, 4, 5, 6] 新的链表
// ListNode head = new ListNode(); 制造一个空节点
// ListNode temp = head; // temp 是给head 干活的 head不用动 最后返回head.next就是新的链表的头节点
private static ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode p1 = l1;
ListNode p2 = l2;
ListNode head = new ListNode();
ListNode temp = head; // 如果用head 作指针的话,后面从链表头部遍历就不行了,因为head已经指到后面去了
while (p1 != null && p2 != null) {
if (p1.val <= p2.val) {
temp.next = new ListNode(p1.val);
p1 = p1.next;
} else {
temp.next = new ListNode(p2.val);
p2 = p2.next;
}
temp = temp.next; // 将temp指针指向 temp.next 位置
}
if (p1 == null) {
temp.next = p2;
} else {
temp.next = p1;
}
return head.next;
}
}
输入 [1, 4, 5] [1, 2, 6], 输出结果如下:
val 1
val 1
val 2
val 4
val 5
val 6