来自左神书中的一道题,在左神核心代码的基础上,添加了链表的构建和打印操作,将这道题完善成了一个小Demo,和各位共勉。
题目:
合并两个有序的单链表。
思路:
逐一比较两个链表的节点将其合并到其中一个链表。
核心算法:
public static 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 = head1;
Node cur2 = head2;
Node pre = null;
Node next = null;
while(cur1 != null && cur2 != null){
if(cur1.value < cur2.value){
pre = cur1;
cur1 = cur1.next;
}else{
pre.next = cur2;
next = cur2.next;
cur2.next = cur1;
pre = cur2;
cur2 = next;
}
}
pre.next = ((cur1 == null) ? cur2 : cur1);
return head;
}
测试代码:
//构建链表1-3-```9
Node head1 = new Node(1);
Node temp1 = head1;
for(int i = 3;i < 10;i+=2){
temp1.next = new Node(i);
temp1 = temp1.next;
}
printList(head1);
//构建链表2-4-```10
Node head2 = new Node(2);
Node temp2 = head2;
for(int i = 4;i <= 10;i+=2){
temp2.next = new Node(i);
temp2 = temp2.next;
}
printList(head2);
Node head = merge(head1, head2);
printList(head);
输出结果:
1->3->5->7->9
2->4->6->8->10
1->2->3->4->5->6->7->8->9->10
原创不易,转载请注明出处哈。
权兴权意
http://blog.youkuaiyun.com/hxqneuq2012/article/details/53262774
public class MergeListTest {
/**
* 权兴权意-2016.11.21
* 合并两个有序的单链表
*/
public static void main(String[] args) {
//构建链表1-3-```9
Node head1 = new Node(1);
Node temp1 = head1;
for(int i = 3;i < 10;i+=2){
temp1.next = new Node(i);
temp1 = temp1.next;
}
printList(head1);
//构建链表2-4-```10
Node head2 = new Node(2);
Node temp2 = head2;
for(int i = 4;i <= 10;i+=2){
temp2.next = new Node(i);
temp2 = temp2.next;
}
printList(head2);
Node head = merge(head1, head2);
printList(head);
}
//打印链表
public static void printList(Node head){
Node temp = head;
while(temp != null){
if(temp.next == null){
System.out.print(temp.value + " ");
break;
}
System.out.print(temp.value + "->");
temp = temp.next;
}
System.out.println();
}
public static 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 = head1;
Node cur2 = head2;
Node pre = null;
Node next = null;
while(cur1 != null && cur2 != null){
if(cur1.value < cur2.value){
pre = cur1;
cur1 = cur1.next;
}else{
pre.next = cur2;
next = cur2.next;
cur2.next = cur1;
pre = cur2;
cur2 = next;
}
}
pre.next = ((cur1 == null) ? cur2 : cur1);
return head;
}
}