题目
给定两个有序单链表的头节点head1和head2,请合并两个有序链表,合并后的链表依然有序,并返回合并后链表的头节点。
思路
本题较为简单,假设两个链表的长度分别为M和N,直接给出时间复杂度为O(M+N),额外空间复杂度为O(1)的具体过程:
- 若其中一个链表为空,无序合并,返回另一个链表的头节点即可
- 比较head1和head2,小的那个记为head,另一个链表的所有节点都会插入head所在的链表
- 假设head所在的链表用cur1遍历,另一个链表用cur2遍历
- 如果cur1先走完,就把cur2没有遍历到的部分直接拼接到cur1的最后。如果cur2先走完,则调整结束。
- 返回头节点head
源码
public static class Node{
public int value;
public Node next;
public Node(int data){
this.value=data;
}
}
public Node merge(Node head1,Node head2){
if(head1==null||head2==null){
return head1!=null?head1:head2;
}
Node head=head1.value<head2.value?head1:head2;
Node cur1=head==head1?head1:head2;
Node cur2=head==head1?head2:head1;
Node pre=null;
Node next=null;
while(cur1!=null&&cur2!=null){
if(cur1.value<=cur2.value){
pre=cur1;
cur1=cur1.next;
}else{
next=cur2.next;
pre.next=cur2;
cur2.next=cur1;
pre=cur2;
cur2=next;
}
}
pre.next=cur1==null?cur2:cur1;
return head;
}