您的位置:首页 > Web前端

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

2020-06-02 06:17 183 查看

题目描述

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

解题思路

递归和遍历两种思路:

  1. 我们合并时,我们用两个链表中值较小的头结点并把它连接到已经合并的链表之后,两个链表剩余的结点依然是排序的,因此合并的步骤和之前的步骤是一样的。这就是典型的递归的过程,可以定义递归函数来完成者以合并过程。
  2. 我们可以遍历两个有序链表,始终用较小值插入到我们目标链表上,直到某一根链表遍历完成。最后需要注意两个链表中可能仍有一个链表还有数据需要处理。

代码实现

import java.util.Scanner;
public class Problem16 {
public static class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
}
}
public static ListNode Merge(ListNode l1,ListNode l2) {
if (l1 == null) return l2;
if (l2 == null) return l1;
ListNode head = null;
if (l1.val <= l2.val){
head = l1;
head.next = Merge(l1.next, l2);
} else {
head = l2;
head.next = Merge(l1, l2.next);
}
return head;
}
public static ListNode Merge1(ListNode l1,ListNode l2) {
ListNode head = new ListNode(-1);
head.next = null;
ListNode root = head;
while(l1 != null && l2 != null) {
if(l1.val < l2.val){
head.next = l1;
head = l1;
l1 = l1.next;
}
else {
head.next = l2;
head = l2;
l2 = l2.next;
}
}
//如果有一个链表为空,另一个链表非空,则应该把非空链表合并到链表尾部。
if(l1 != null) {
head.next = l1;
}
if(l2 != null) {
head.next = l2;
}
return root.next;
}
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: