您的位置:首页 > Web前端

剑指offer---合并两个排序的链表

2016-06-23 22:29 369 查看
题目描述

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

解法一:

public static ListNode Merge(ListNode list1, ListNode list2) {
if (list1 == null)
return list2;
if (list2 == null)
return list1;
// 创建一个临时结点,用于添加元素时方便
ListNode root = new ListNode(0);
// 用于指向合并后的新链的尾结点
ListNode pointer = root;
while (list1 != null && list2 != null) {
if (list1.val < list2.val) {
pointer.next = list1;
list1 = list1.next;
} else {
pointer.next = list2;
list2 = list2.next;
}
pointer = pointer.next;
}

if (list1 != null) {
pointer.next = list1;
}
if (list2 != null) {
pointer.next = list2;
}
return root.next;
}


解法二:

public static ListNode Merge2(ListNode list1, ListNode list2) {
if (list1 == null)
return list2;
if (list2 == null)
return list1;
ListNode head = null;
if (list1.val <= list2.val) {
head = list1;
head.next = Merge2(list1.next, list2);
} else {
head = list2;
head.next = Merge2(list1, list2.next);
}
return head;
}


完整代码:

public class ListNode {

int val;
ListNode next = null;

public ListNode(int val) {
this.val = val;
}

public static void printList(ListNode head) {
while (head != null) {
System.out.print(head.val + "->");
head = head.next;
}
}

public static void main(String[] args) {
ListNode head = new ListNode(1);
head.next = new ListNode(2);
head.next.next = new ListNode(3);
head.next.next.next = new ListNode(4);
head.next.next.next.next = new ListNode(5);

printList(head);
System.out.println();
ListNode head2 = new ListNode(1);
head2.next = new ListNode(3);
head2.next.next = new ListNode(5);
head2.next.next.next = new ListNode(6);
head2.next.next.next.next = new ListNode(7);
printList(head2);
System.out.println();

head = Merge(head, head2);
// head = Merge2(head, head2);
printList(head);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: