Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

สร้าง Linked List ผลรวมสูงสุดจาก 2 Sorted Lists ใน Python

ภาพรวม

โจทย์: กำหนด 2 sorted linked lists ที่มีโหนดบางตัวซ้ำกัน (common nodes) สร้าง linked list ใหม่ที่มีผลรวมค่าโหนดมากที่สุดจาก head ถึง tail สลับ list ได้เฉพาะที่โหนดซ้ำ (intersection)

ตัวอย่าง

List A: 6 → 8 → 35 → 95 → 115 → 125

List B: 5 → 8 → 17 → 37 → 95 → 105 → 125 → 135

Common nodes: 8, 95, 125

เส้นทางที่ดีที่สุด: 6→8 (A) → 17→37 (B) → 95 (common) → 115→125 (A) → 135 (B)

ผลลัพธ์: [6, 8, 17, 37, 95, 115, 125, 135]

อัลกอริทึม

  1. ใช้ 2 pointers (current1, current2) เดินพร้อมกัน
  2. สะสมผลรวม res1, res2 ระหว่าง common nodes
  3. ที่ common node: เลือก path ที่ผลรวมมากกว่า เชื่อม pointer ตรงข้าม
  4. ทำซ้ำจนจบทั้ง 2 lists
  5. ใช้พื้นที่ O(1) เพิ่มเติม

โค้ด Python

class LinkedList:
    class ListNode:
        def __init__(self, d):
            self.data = d
            self.next = None
    def __init__(self, data_set=[]):
        self.head = None
        for item in data_set:
            self.insert_node(item)
    def insert_node(self, new_data):
        new_node = self.ListNode(new_data)
        new_node.next = self.head
        self.head = new_node
    def find_max_sum_list(self, a, b):
        result = None
        prev1, curr1 = a, a
        prev2, curr2 = b, b
        while curr1 or curr2:
            sum1 = sum2 = 0
            while curr1 and curr2 and curr1.data != curr2.data:
                if curr1.data < curr2.data:
                    sum1 += curr1.data
                    curr1 = curr1.next
                else:
                    sum2 += curr2.data
                    curr2 = curr2.next
            if not curr1:
                while curr2:
                    sum2 += curr2.data
                    curr2 = curr2.next
            if not curr2:
                while curr1:
                    sum1 += curr1.data
                    curr1 = curr1.next
            if prev1 == a and prev2 == b:
                result = prev1 if sum1 > sum2 else prev2
            else:
                if sum1 > sum2:
                    prev2.next = prev1.next
                else:
                    prev1.next = prev2.next
            prev1, prev2 = curr1, curr2
            if curr1: curr1 = curr1.next
            if curr2: curr2 = curr2.next
        while result:
            print(result.data, end=' ')
            result = result.next

my_list1 = LinkedList([125,115,95,35,8,6])
my_list2 = LinkedList([135,125,105,95,37,17,8,5])
my_list1.find_max_sum_list(my_list1.head, my_list2.head)

ผลลัพธ์

6 8 17 37 95 115 125 135