📅  最后修改于: 2023-12-03 15:42:07.922000             🧑  作者: Mango
链表中最长递增子列表是指链表中连续的一段节点组成的子列表,满足节点值单调递增的条件,并且该子列表的长度是最长的。
我们可以遍历一遍链表,同时维护两个变量:当前递增子列表的起始节点和结束节点,以及最长递增子列表的起始节点和结束节点。当遇到一个节点值不符合递增条件时,就可以更新当前递增子列表的起始节点和结束节点,重新开始计算递增子列表。如果当前递增子列表的长度大于最长递增子列表的长度,就更新最长递增子列表的起始节点和结束节点。
下面是 Python 代码实现:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def longest_increasing_sublist(head: ListNode) -> ListNode:
if not head:
return None
longest_start = longest_end = curr_start = curr_end = head
curr = head.next
while curr:
if curr.val > curr_end.val:
curr_end = curr
else:
curr_start = curr_end = curr
if curr_end.next and curr_end.next.val > curr_end.val:
curr = curr_end.next
else:
if curr_end == longest_end:
longest_start = curr_start
longest_end = curr_end
curr_start = curr_end = curr_end.next
curr = curr_end
return longest_start
# Example usage:
head = ListNode(1, ListNode(2, ListNode(3, ListNode(2, ListNode(4, ListNode(5, ListNode(1)))))))
longest = longest_increasing_sublist(head)
print(longest.val) # Output: 2
print(longest.next.val) # Output: 4
print(longest.next.next.val) # Output: 5
该算法的时间复杂度为 $O(n)$,其中 $n$ 是链表的长度。因为我们只需要遍历一遍链表即可找到最长递增子列表。
该算法的空间复杂度为 $O(1)$,因为我们只需要维护几个指针。