算法:合并两个有序链表


题目:合并两个有序链表

将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例:

1
2
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-two-sorted-lists

分析

这道题目有两个做法,首先第一个是迭代这是做容易想到的。不断遍历,每次取出节点数字较小的拼接起来即可。

第二种方法是递归。每次分离出节点数字小的,然后把剩下继续递归,直到一方为空。

解答

  1. 方法一:迭代
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**
* Example:
* var li = ListNode(5)
* var v = li.`val`
* Definition for singly-linked list.
* class ListNode(var `val`: Int) {
* var next: ListNode? = null
* }
*/
fun mergeTwoLists(l1: ListNode?, l2: ListNode?): ListNode? {
when{
l1==null&&l2==null -> return null
l1==null -> return l2
l2==null -> return l1
}
val listNode :ListNode? = ListNode(0)
var current = listNode
var point1 = l1
var point2 = l2
while (point1!=null&&point2!=null){
if (point1.`val`<point2.`val`){
current?.next = point1
point1 = point1.next
} else {
current?.next = point2
point2 = point2.next
}
current = current?.next
}
if (point1==null){
current?.next = point2
} else {
current?.next = point1
}
return listNode?.next
}
  1. 方法二:递归
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
fun mergeTwoLists(l1: ListNode?, l2: ListNode?): ListNode?{
when{
l1==null&&l2==null -> return null
l1==null -> return l2
l2==null -> return l1
}
val list1 = l1
val list2 = l2
if (list1!!.`val`<list2!!.`val`){
list1.next = mergeTwoLists(list1.next,list2)
return list1
}else {
list2.next = mergeTwoLists(list2.next,list1)
return list2
}
}

文章作者: zhegnhuan
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 zhegnhuan !
 上一篇
算法:两数相加 算法:两数相加
题目:两数相加给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0
2020-05-23
下一篇 
算法:每个元音包含偶数次的最长字符串 算法:每个元音包含偶数次的最长字符串
题目给你一个字符串 s ,请你返回满足以下条件的最长子字符串的长度:每个元音字母,即 ‘a’,’e’,’i’,’o’,’u’ ,在子字符串中都恰好出现了偶数次。 示例 1: 123输入:s = "eleetminico
2020-05-20
  目录