Task02 顺序表和链表

1、合并两个有序链表

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

def mergetwoLists(self, l1, l2):
        if l1 is None:
            return l2
        elif l2 is None:
            return l1
        elif l1.val < l2.val:
            l1.next = self.mergeTwoLists(l1.next, l2)
            return l1
        else:
            l2.next = self.mergeTwoLists(l1, l2.next)
            return l2

2、删除链表的倒数第N个节点

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。

示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.

def removeNthFromEnd(self, head, n):
        if not head or n<=0: #链表为空或者n无效
            return head
        p = ListNode(-1) #建造一个虚拟节点,方便边界处理
        p.next = head 
        #一次遍历得到链表长度
        a = p
        k = 0
        while a.next: 
            a = a.next
            k = k+1
        if k<n: #n无效
            return head
        #二次遍历找到需要删除的节点
        b = p
        num = k-n #需删除的前一个节点位置
        while num > 0:
            b = b.next
            num = num-1
        b.next = b.next.next #将指针指向删除节点的后一位
        return p.next 

3、旋转链表

给定一个链表,旋转链表,将链表每个节点向右移动k个位置,其中k是非负数。

示例 :
输入: 1->2->3->4->5->NULL, k = 2
输出: 4->5->1->2->3->NULL

解释:
向右旋转 1 步: 5->1->2->3->4->NULL
向右旋转 2 步: 4->5->1->2->3->NULL

def rotateRight(self, head, k):
        if not head:
            return None
        if not head.next:
            return head
        old_tail = head 
        n = 1
        while old_tail.next: #计算链表长度
            old_tail = old_tail.next
            n = n+1
        old_tail.next = head #构造成环状

        new_tail = head 
        m = n - k % n -1
        while m:
            new_tail = new_tail.next #新的尾结点的位置
            m = m-1
        new_head = new_tail.next #新的头结点的位置
        new_tail.next = None #切断这个环
        return new_head

发布了8 篇原创文章 · 获赞 1 · 访问量 193

猜你喜欢

转载自blog.csdn.net/Moby97/article/details/103899064