2020.11.5————合并两个有序链表
题目
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
解题一
语言
java
思路
merge=
{
list1[0]+merge(list1[1:],list2) list1[0]<list2[0]
list2[0]+merge(list1,list2[1:]) otherwise
}
将每个链表里面较小的节点插到另一个节点上
代码
/**
* 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; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1==null){
return l2;//如果l1为空返回l2
}
else if(l2==null){
return l1;//如果l2为空返回l1
}
else if(l1.val<l2.val){
l1.next = mergeTwoLists(l1.next,l2);//如果此时l1的节点小那就将l1这个节点与另一个合并
return l1;
}
else{
l2.next = mergeTwoLists(l2.next,l1);//同上
return l2;
}
}
}
解题二
语言
java
思路
迭代法:
还是比较每个节点,不过要设置四个指针进行链接。
- prehead是头节点,用来输出,注意要加next。
- prev用来遍历链表进行链接
- l1用来指向l1链表
- l2用来指向l2链表
代码
/**
* 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; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode prehead = new ListNode(-1);//创建一个哨兵节点作为头
ListNode prev = prehead;//创建一个遍历节点,一开始指向头
while(l1!=null&&l2!=null){
if(l1.val<=l2.val){
prev.next = l1;
l1 = l1.next;
}else{
prev.next = l2;
l2 = l2.next;
}
prev = prev.next;//连接
}
//合并后肯定有个没合并完,这时候要判断
prev.next=l1==null?l2:l1;
return prehead.next;//头节点注意要加next
}
}